import streamlit as st
import os
from streamlit_gallery import streamlit_image_gallery

st.title("🖼️ 图片画廊 - 支持本地和网络图片")
st.write("**现在支持本地图片文件和网络图片URL！**")

# 创建示例图片目录
example_dir = "example_images"
if not os.path.exists(example_dir):
    os.makedirs(example_dir)
    st.info(f"📁 创建了示例目录: {example_dir}")
    st.write("请在此目录中放置一些图片文件来测试本地图片功能。")

# 混合图片列表 - 包含网络图片和本地图片
images = [
    # 网络图片
    {
        "src": 'https://images.unsplash.com/photo-1718439111428-f6ef86aae18d',
        "title": '网络图片 - 白花',
    },
    {
        "src": 'https://images.unsplash.com/photo-1718554517666-2978ede88574',
        "title": '网络图片 - 小鸟',
    },
    # 本地图片示例（如果文件存在）
    {
        "src": os.path.join(example_dir, 'sample1.jpg'),
        "title": '本地图片 - 示例1',
    },
    {
        "src": os.path.join(example_dir, 'sample2.png'),
        "title": '本地图片 - 示例2',
    },
    {
        "src": os.path.join(example_dir, 'sample3.gif'),
        "title": '本地图片 - 示例3',
    },
]

# 过滤掉不存在的本地文件
valid_images = []
for image in images:
    if image['src'].startswith('http'):
        # 网络图片直接添加
        valid_images.append(image)
    elif os.path.exists(image['src']):
        # 本地图片存在则添加
        valid_images.append(image)
    else:
        # 本地图片不存在，显示提示
        st.warning(f"⚠️ 本地图片文件不存在: {image['src']}")

if not valid_images:
    st.error("❌ 没有找到任何有效的图片！")
    st.write("请确保：")
    st.write("1. 网络连接正常（用于网络图片）")
    st.write("2. 在 `example_images` 目录中放置一些图片文件")
    st.stop()

st.markdown("""
### ✨ 新功能特性:
- 🖼️ **支持本地图片文件** (JPG, PNG, GIF, BMP, WebP)
- 🌐 **支持网络图片URL**
- 🔄 **自动检测图片类型**
- ⚡ **Base64编码本地图片**
- ❌ **错误处理和加载状态**
- 📁 **本地文件标识**

### 🏗️ 技术实现:
- **智能路径检测** - 自动区分本地文件和网络URL
- **Base64编码** - 本地图片转换为data URL
- **MIME类型检测** - 根据文件扩展名确定正确的MIME类型
- **错误处理** - 优雅处理文件不存在或加载失败的情况
""")

st.subheader("混合图片画廊:")

# 使用画廊组件
clicked_index = streamlit_image_gallery(
    images=valid_images, 
    max_cols=3, 
    gap=10,
    key="mixed_gallery"
)

# 显示结果
if clicked_index is not None and clicked_index < len(valid_images):
    selected_image = valid_images[clicked_index]
    st.success(f"🎯 您点击了图片 #{clicked_index}: **{selected_image['title']}**")
    
    if selected_image['src'].startswith('http'):
        st.write(f"🌐 网络图片URL: `{selected_image['src']}`")
    else:
        st.write(f"📁 本地文件路径: `{selected_image['src']}`")
        file_size = os.path.getsize(selected_image['src'])
        st.write(f"📊 文件大小: {file_size:,} 字节")
else:
    st.info("✨ 悬停在图片上查看效果，然后点击选择！")

# 添加使用说明
st.markdown("---")
st.subheader("📖 使用方法")

st.markdown("""
### 本地图片使用:
```python
images = [
    {
        "src": "path/to/your/image.jpg",
        "title": "我的本地图片"
    },
    {
        "src": "images/photo.png", 
        "title": "另一张本地图片"
    }
]
```

### 网络图片使用:
```python
images = [
    {
        "src": "https://example.com/image.jpg",
        "title": "网络图片"
    }
]
```

### 混合使用:
```python
images = [
    {"src": "local_image.jpg", "title": "本地图片"},
    {"src": "https://example.com/remote.jpg", "title": "网络图片"}
]
```

### 支持的图片格式:
- **本地文件**: JPG, JPEG, PNG, GIF, BMP, WebP
- **网络图片**: 任何浏览器支持的图片格式
""") 